unit clasecodificador;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, ASyncprocess, Process, Forms, FileUtil;

type
  TCodificador = class(TThread)
    private
      Proceso : TAsyncProcess;
      CodigoSalida : Integer;
      EstaProcesando : Boolean;
    public
      {salida}
      LSalida : TStringList;
      Estado : String;


      {function}
      Function GetCodigoSalida: Integer;

      {proceso}
      Procedure Ejecutar(Comandos, Parametros : String);
      Procedure LeerData(Sender : TObject);
      Procedure Terminar(Sender : TObject);

      {ejecucion}
      Function ObtenerEstadoProceso: Boolean;
      Function ObtenerEstado(): String;
      Procedure Matar();

      Constructor Create();
      Destructor Destroy();

      { Get / Set }
//      Function GetEstado(): String; // Estado en tiempo real
//      Procedure SetTarea(Tarea : Integer);

  end;

implementation
Function TCodificador.GetCodigoSalida : Integer;
Begin
  Result := CodigoSalida;
end;

Procedure TCodificador.Matar;
Begin
  Proceso.Suspend;
  sleep(1500);
  Proceso.Terminate(0);
   sleep(1000);
End;
Function TCodificador.ObtenerEstadoProceso: Boolean;
Begin
     EstaProcesando := Proceso.Active;
     Result := EstaProcesando;
end;

Function TCodificador.ObtenerEstado(): String;
Begin
  Result := Estado;
end;

Destructor TCodificador.Destroy();
Begin
  Proceso.Free();
  LSalida.Free();
end;

Constructor TCodificador.Create();
Begin

    { Process }
    Proceso := TAsyncProcess.Create(nil);
    Proceso.OnReadData := @LeerData;
    Proceso.OnTerminate := @Terminar;
    Proceso.Priority := ppIdle;
//    Proceso.WaitOnExit := True;
//    Proceso.FreeOnRelease := True;
    Proceso.CurrentDirectory := ExtractFilePath(Application.ExeName) + 'temp\';
    Proceso.Options := [poUsePipes, poStderrToOutPut];
    Proceso.Options := Proceso.Options + [poNoConsole];
    EstaProcesando := Proceso.Running;

    { Logs }
    LSalida := TStringList.Create();
end;

Procedure TCodificador.LeerData(Sender : TObject);
Begin
  // Leer salida de la consola (última línea)
  LSalida.LoadFromStream(Proceso.Output);
  if (LSalida.Count > 0) then
    Estado := LSalida.Strings[LSalida.Count - 1];

  // Debug de consola
  //WriteLn(Estado);


end;

Procedure TCodificador.Terminar(Sender : TObject);
Begin
  EstaProcesando := Proceso.Running;
  CodigoSalida := Proceso.ExitStatus;
end;

Procedure TCodificador.Ejecutar(Comandos, Parametros : String);
Begin
  Proceso.CommandLine := UTF8ToSys(Comandos + ' ' + Parametros);
  EstaProcesando := Proceso.Running;
  Proceso.Execute();

end;


end.

